#pragma once
#include <iostream>
#include <cstdarg>
#include <cstdio>
#include <ctime>
#include <string>

// 日志是有日志级别的
#define DEBUG 0   // 调试信息
#define NORMAL 1   // 好着呢
#define WARNING 2  // 警告
#define ERROR 3   // 错误的，程序可以执行
#define FATAL 4   // 致命的

const char* gLevelMap[] = {
    "DEBUG",
    "NORMAL",
    "WARNING",
    "ERROR",
    "FATAL"
};

#define LOGFILE "./threadpool.txt"

// 完成的日志功能, 至少: 日志等级  时间  支持用户自定义(日志内容, 文件行, 文件名)
void logMessage(int level, const char* format, ...)  // 可变参数
{
#ifndef DEBUG_SHOW     // 在命令行中如果我定义了这个宏 -DDEBUG_SHOW 就是在调试
                                    // 如果我不想调试, 在命令行中注释掉这个宏,不用改代码,DEBUG的日志就不会出现了
    if (level == DEBUG) return;
#endif

    // 这些接口可以在man中去查看
    // va_list ap;
    // va_start(ap, format);
    // //while ()
    // int x = va_arg(ap, int);
    // va_end(ap); // ap = nullptr


    char stdBuffer[1024]; // 标准部分
    time_t timestamp = time(nullptr);
    //struct tm* localtime = localtime(&timestamp);

    snprintf(stdBuffer, sizeof stdBuffer, "[%s] [%ld] ", gLevelMap[level], timestamp); // 实际用的时候可以写在文件里


    char logBuffer[1024]; // 自定义部分
    va_list args; // 定义
    va_start(args, format); // 确定起始地址
    //vprintf(format, args);  // 打印  vprintf->显示器打印  vfprintf—>文件里打印  vsprintf—>字符串里打印 vsnprintf->字符串里打印
    vsnprintf(logBuffer, sizeof logBuffer, format, args); // 实际用的时候可以写在文件里
    va_end(args);  // 关闭

    // 把日志信息打印到文件中
    FILE* fp = fopen(LOGFILE, "a"); // 这里是追加 a 打开
    //vfprintf(fp, format, args);
    fprintf(fp, "%s%s\n", stdBuffer, logBuffer);

    //打印出来
    printf("%s%s\n", stdBuffer, logBuffer);
    fclose(fp);
}